package springTaskExecutor.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

/**
 * @author CKC
 * @DateTime 2021/12/12 17:02
 */
@Configuration
public class TaskExecutorConfig {
    /* spring 默认提供了以下 :
     * SyncTaskExecutor: 此实现不会异步运行调用。相反，每次调用都发生在调用线程中。它主要用于不需要多线程的情况，例如简单的测试用例。
     * SimpleAsyncTaskExecutor:	此实现不重用任何线程。相反，它为每次调用启动一个新线程。但是，它确实支持并发限制，该限制会阻止任何超出限制的调用，直到插槽被释放为止。
     * ConcurrentTaskExecutor: 这个实现是一个java.util.concurrent.Executor实例的适配器。
     * ThreadPoolTaskExecutor: 这个实现是最常用的。它公开用于配置 a 的 bean 属性java.util.concurrent.ThreadPoolExecutor并将其包装在TaskExecutor.
     * WorkManagerTaskExecutor:	此实现使用 CommonJWorkManager作为其后备服务提供者，并且是在 Spring 应用程序上下文中在 WebLogic 或 WebSphere 上设置基于 CommonJ 的线程池集成的中心便利类。
     * DefaultManagedTaskExecutor: 此实现使用ManagedExecutorService在 JSR-236 兼容运行时环境（例如 Java EE 7+ 应用服务器）中获得的 JNDI，为此目的替换了 CommonJ WorkManager。
     */
    @Bean
    @Primary
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
        poolTaskExecutor.setCorePoolSize(2);
        poolTaskExecutor.setMaxPoolSize(5);
        poolTaskExecutor.setQueueCapacity(25);
        poolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return poolTaskExecutor;
    }
}
